<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>state</title>
    <!-- 引入 react核心库 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!-- 引入 react-dom 用于支持操作DOM -->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!-- 引入 babel 用于将 jsx转为 js -->
    <script type="text/javascript" src="../js/babel.min.js"></script>
</head>
<body>
<div id="test"></div>

<script type="text/babel">
    class Weather extends React.Component {
        // 构造器调用几次：1次
        constructor(props) {
            //console.log("call constructor");
            super(props);
            this.state = {
                isHot: false,
                wind: '微风'
            }
            // 解决 changeWeather 中this指向问题
            this.changeWeather = this.changeWeather.bind(this);
        }
        changeWeather() {
            // changeWeather 放在哪里? Weather 的原型对象上，供实例调用
            // 由于changeWeather 是作为onClick 的回调, 所以不是通过实例调用的，是直接调用的。
            // 类中的方法默认开启了局部的严格模式, 所以changeWeather 中的this 为undefined
            // console.log(this);
            const isHot = this.state.isHot;
            // !!! 严重注意： 状态（state）不可直接更改,下面这行就是直接更改
            // this.state.isHot = !isHot;  这是错误的写法！！！！
            // !!! 严重注意 状态（state）必须要通过 setState 更新，且更新是合并，不是直接替换
            this.setState({isHot: !isHot})
        }

        // render 调用几次  --- 1+n 次，n 就是状态更新的次数
        render() {
            console.log("call render");
            // 注意此处给组件绑定事件的写法
            const { isHot, wind} = this.state;
            return <h1 onClick={this.changeWeather}>今天天气很{isHot ? "炎热" : "凉爽"}, {wind}</h1>
        }

    }

    ReactDOM.render(<Weather />, document.getElementById("test"));


</script>
</body>
</html>